let { guid } = require("./util.js");
/**
 * 共用的一些方法
 */
let baseURL = "";
let isBinding = false; // 标记是否弹出授权框，避免多次弹出

const setConfig = config => {
  if (!config.header) config.header = {};
  config.enableHttp2 = true;
  config.enableCache = true;
  config.loading = config.loading || false;
  config.ignoreAuth = config.ignoreAuth || false;
  config.forceBind = config.forceBind || false; // 是否强制登录？是 => 登录授权页面不显示拒绝按钮；否 => 登录授权页面显示拒绝按钮；
  // 配置共用的头部
  let uuid = wx.getStorageSync("uuid");
  if (uuid) {
    config.header["session-id"] = uuid;
  } else {
    let newUuid = guid();
    wx.setStorageSync("uuid", newUuid);
    config.header["session-id"] = newUuid;
  }
  // 设置链接
  if (config.url && !config.url.startsWith("http")) {
    config.url = baseURL + config.url;
  }
  //设置loading
  if (config.loading) {
    wx.showLoading({
      title: '加载中',
      icon: 'none'
    })
  }
};
// 基本请求
const request = config => {
  setConfig(config);
  
  // 添加token到请求头
  const token = wx.getStorageSync('token');
  if (token && config.header) {
    config.header['Authorization'] = 'Bearer ' + token;
  }
  
  // 打印请求信息，方便调试
  console.log('请求URL:', config.url);
  console.log('请求方法:', config.method);
  console.log('请求数据:', config.data);
  console.log('请求头:', config.header);
  
  // 设置回调
  let success = config.success;
  let loading = config.loading;
  config.success = (res) => {
    if (loading) {
      wx.hideLoading();
    }
    
    // 打印响应数据，方便调试
    console.log('API响应状态码:', res.statusCode);
    console.log('API响应详情:', res);
    
    // 为POST请求添加更详细的日志
    if (config.method === 'POST') {
      console.log('POST请求详细响应数据:', JSON.stringify(res.data));
    }
    
    // 处理不同的响应情况
    if (res.statusCode === 401) {
      // 清除登录状态
      let app = getApp();
      if (app) {
        app.globalData.isLogin = false;
        app.globalData.userInfo = null;
      }
      if (config.ignoreAuth) {
        return;
      }
      if (isBinding) return; // 已经存在未处理的授权框，就不再弹出多余的
      isBinding = true; // 标记弹出授权框
      wx.showModal({
        title: "提示",
        content: "该功能需要登录后才能使用，是否前往登录？",
        success: function (res) {
          isBinding = false; // 标记已经点击
          if (res.confirm) {
            wx.navigateTo({
              url: `/pages/login/login?forceBind=${config.forceBind}`
            });
          } else {
            let page = getCurrentPages(); //获取页面栈
            if (page.length > 1) {
              wx.navigateBack();
            } else {
              wx.reLaunch({
                url: '/pages/login/login',
              })
            }
          }
        }
      });
    } else if (res.statusCode === 403) {
      wx.showModal({
        title: "提示",
        content: "暂无权限",
        success() {
          wx.navigateBack({
            delta: 1
          });
        }
      });
    } else if (res.statusCode === 200) {
      // 服务正常响应
      console.log('服务器正常响应，数据:', res.data);
      if (success) {
        success(res.data);
      }
    } else {
      // 其他错误状态码
      console.error('服务器响应错误:', res.statusCode, res.data);
      wx.showToast({
        title: res.data && res.data.message ? res.data.message : '请求失败',
        icon: 'none'
      });
    }
  };
  
  let fail = config.fail;
  config.fail = (err) => {
    console.error('请求失败:', err);
    if (loading) {
      wx.hideLoading();
    }
    wx.showToast({
      title: '请求出错',
      icon: 'none'
    });
    if (fail) {
      fail(err);
    }
  }
  wx.request(config);
};

// 下载文件
const downloadFile = config => {
  setConfig(config);
  wx.downloadFile(config);
};
// 上传文件
const uploadFile = config => {
  setConfig(config);
  config.filePath = config.filePath || '';
  config.name = config.name || '';
  config.formData = config.formData || {};
  config.header["Content-Type"] = "application/x-www-form-urlencoded";
  wx.uploadFile(config);
};
const init = config => {
  if (config.baseURL) {
    baseURL = config.baseURL;
  }
  wx.mRequest = request;
  wx.mDwnloadFile = downloadFile;
  wx.mUploadFile = uploadFile;
};

module.exports = {
  init: init,
  setConfig: setConfig,
  request: request,
  downloadFile: downloadFile,
  uploadFile: uploadFile
};
